- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Графические интерфейсы пользователя Java - Тимур Сергеевич Машнин
Шрифт:
Интервал:
Закладка:
Запуск объекта Service осуществляется с помощью метода start,
перезапуск объекта Service – с помощью метода restart,
а сброс объекта Service – с помощью метода reset.
Прерывание выполнения фоновой задачи обеспечивает метод cancel класса Service.
Получить результат выполнения фоновой задачи можно с помощью метода getValue класса Service.
В качестве примера выполнения фоновой задачи в JavaFX-приложении здесь приведен код, в котором индикатор ProgressBar отображает ход вычислений, производимых в фоновом потоке.
Здесь мы создаем индикатор и кнопку.
В обработчике нажатия кнопки мы создаем фоновую задачу, в методе call которой мы вызываем метод updateProgress, передавая прогресс выполнения задачи.
В методе updateProgress мы обновляем индикатор.
Дальше мы запускаем задачу с помощью объекта Service.
И создаем вторую кнопку для сброса индикатора.
Если возникает потребность обновлять JavaFX компоненты в методе call задачи Task, можно использовать метод Platform.runLater с объектом Runnable, в методе run которого обращаться к JavaFX компонентам.
Класс ScheduledService расширяет класс Service, обеспечивая автоматический перезапуск фоновой задачи после успешного выполнения, и при некоторых условиях перезапуск даже в случае сбоя.
При создании объект ScheduledService находится в состоянии READY.
После вызова метода start или restart объект ScheduledService переходит в состояние SCHEDULED на время, указанное свойством delay.
В состоянии RUNNING объект ScheduledService выполняет свою задачу.
По завершении задачи объект ScheduledService переходит в состояние SUCCEEDED, затем в состояние READY, а затем возвращается в состояние SCHEDULED.
Продолжительность пребывания в состоянии SCHEDULED зависит от времени последнего перехода в состояние RUNNING, текущего времени и значения свойства period, которое определяет минимальное время между двумя последовательными прогонами.
Если предыдущее выполнение завершено до истечения значения свойства period, то объект ScheduledService остается в состоянии SCHEDULED до истечения значения свойства period.
В противном случае, если предыдущее выполнение заняло больше времени, чем указанное значения свойства period, объект ScheduledService мгновенно переходит в состояние RUNNING.
В случае, когда задача завершается в состоянии FAILED, объект ScheduledService перезапускается или завершается, в зависимости от значений свойств restartOnFailure, backoffStrategy и maximumFailureCount.
Если свойство restartOnFailure имеет значение false, объект ScheduledService переходит в состояние FAILED и завершает работу.
В этом случае вы можете перезапустить поврежденный объект ScheduledService вручную.
Если свойство restartOnFailure имеет значение true, объект ScheduledService переходит в состояние SCHEDULED и остается в этом состоянии на протяжении всего свойства cumulativePeriod, которое получается в результате вызова свойства backoffStrategy.
Используя свойство cumulativePeriod, вы можете заставить поврежденный объект ScheduledService ждать до следующего прогона.
После успешного завершения ScheduledService свойство cumulativePeriod сбрасывается до значения свойства period.
Когда количество последовательных сбоев достигает значения свойства maximumFailureCount, объект ScheduledService переходит в состояние FAILED и завершает работу.
Любые изменения, которые происходят с свойствами delay и period при запуске объекта ScheduledService, будут учтены на следующей итерации.
Значения по умолчанию для свойств delay и period установлены в 0.
Совместное использование Swing и JavaFX, SWT и JavaFX
Пакет embed. swing платформы JavaFX обеспечивает встраивание JavaFX-сцены в Swing-приложение.
Для этого пакет javafx. embed. swing предоставляет компонент JFXPanel.
Класс JFXPanel расширяет класс swing. JComponent, являющийся базовым классом для всех Swing-компонентов, помещаемых в Swing-контейнеры верхнего уровня JFrame и JDialog.
Класс JFXPanel имеет, помимо унаследованных от класса JComponent, публичные методы, в том числе метод setScene, устанавливающий JavaFX сцену.
При использовании компонента JFXPanel в Swing-приложении необходимо учитывать, что Swing-компоненты обрабатываются в потоке Event Dispatch Thread, а JavaFX-компоненты – в потоке JavaFX Application Thread.
Поэтому для инициализации и изменения графа JavaFX-сцены в Swing-приложении используется метод Platform.runLater.
А для инициализации и изменения Swing-интерфейса используется метод SwingUtilities.invokeLater.
Обратную операцию – встраивание Swing компонентов в JavaFX приложение позволяет класс SwingNode пакета embed. swing.
Здесь мы создаем некий Swing контент, который устанавливаем в узел SwingNode методом setContent.
Делаем мы это в Swing потоке Event Dispatch Thread.
И затем используем этот узел уже в потоке JavaFX Application Thread.
Аналогично пакету embed. swing, пакет embed. swt платформы JavaFX обеспечивает встраивание JavaFX-сцены в SWT-приложение.
Для этого пакет embed. swt предоставляет компонент FXCanvas.
Класс FXCanvas расширяет класс Canvas пакета swt. widgets графической библиотеки SWT, обеспечивающий рисование произвольной графики.
Класс FXCanvas имеет, помимо унаследованных от класса Canvas, публичные методы, в том числе метод setScene, устанавливающий JavaFX сцену.
JavaFX-сцена вставляется в FXCanvas-компонент, а FXCanvas-компонент вставляется в SWT-окно Shell с помощью приведенного здесь шаблона кода.
О библиотеке SWT мы поговорим позже.
Язык FXML
Платформа JavaFX представляет альтернативный Java-коду способ создания графа сцены JavaFX-приложения с помощью языка FXML, являющегося декларативным языком, основанным на языке XML.
Применение языка FXML находится в русле традиций использования декларативных языков для описания графических интерфейсов пользователя.
Использование языка FXML заключается в создании FXML-файла, содержащего описание дочерних узлов корневого узла графа сцены, и загрузки его с помощью статического метода load класса FXMLLoader, возвращающего корневой узел графа сцены.
Преимущество такой модели создания графического интерфейса заключается в том, что изменение графа сцены JavaFX-приложения не требует перекомпиляции Java-кода – FXML-описание интерфейса загружается при запуске JavaFX-приложения.
FXML-файл содержит описание корневой JavaFX-панели AnchorPane с дочерними JavaFX-компонентами Button и Label.
Атрибут onAction компонента Button ссылается на метод handleButtonAction, обрабатывающий нажатие кнопки Button, класса Controller, который определен в качестве контроллера атрибутом fx: controller компонента AnchorPane.
Язык FXML поддерживает шаблон проектирования Model-View-Controller (MVC), разделяющий бизнес-логику, представление данных и взаимодействие с пользователем.
В MVC-терминологии FXML-описание является представлением View, модель Model представляет компонент JavaFX Beans, обеспечивающий данные JavaFX-приложения, а контроллером Controller является Java-класс, реализующий код взаимодействия с пользователем и связывания компонента JavaFX Beans с FXML-описанием графического интерфейса JavaFX-приложения.
Для включения такого контроллера в JavaFX-приложение, его необходимо указать в качестве значения атрибута fx: controller FXML-описания.
FXML-контроллер может реализовывать интерфейс Initializable, имеющий единственный метод initialize, вызываемый средой выполнения для инициализации класса FXML-контроллера и используемый, например, для связывания компонента данных JavaFX Beans с FXML-описанием.
Методу initialize, в качестве аргументов, среда выполнения передает URL-адрес FXML-описания графического интерфейса JavaFX-приложения и ResourceBundle-ресурсы JavaFX-приложения.
URL-адрес FXML-описания и ResourceBundle-ресурсы определяются при вызове в главном классе JavaFX-приложения статического метода load класса FXMLLoader.
Файл ResourceBundle-ресурсов решает задачу локализации строк графического интерфейса и передается как ResourceBundle-объект методу load с помощью статического метода getBundle класса java.util.ResourceBundle.
В пакете приложения можно создать файл с расширением. properties, имя которого без расширения, но предваряя именем пакета, нужно указать в аргументе метода ResourceBundle.getBundle.
Заполнив файл ResourceBundle-ресурсов парами ключ-значение, получить доступ к любому значению можно с помощью метода getString класса ResourceBundle в Java-коде, указав в качестве аргумента ключ, или используя префикс «%» и имя ключа в качестве значения атрибута компонента FXML-описания.
Помимо интерфейса Initializable, FXML-контроллер может использовать аннотацию @FXML пакета javafx. fxml, которая маркирует protected или private поля и методы FXML-контроллера, доступные из FXML-описания.
Чтобы не применять аннотацию @FXML, поля и методы

